package com.taoism.utils;

import java.math.BigDecimal;
import java.text.DecimalFormat;

public class CoordinateUtils {

    private static final double EARTH_RADIUS = 6378.137;

    private static double rad(double d) {
        return d * Math.PI / 180.0;
    }

    /**
     * 计算两个坐标距离（单位：m）
     *
     * @param long1 第一个坐标经度
     * @param lat1  第一个坐标纬度
     * @param long2 第二个坐标经度
     * @param lat2  第二个坐标纬度
     * @return
     * @author liujunxia
     * @date 2018年1月9日下午2:54:57
     * @version v0.0.1
     */
    public static double getDistance(double long1, double lat1, double long2, double lat2) {
        double a, b, d, sa2, sb2;
        lat1 = rad(lat1);
        lat2 = rad(lat2);
        a = lat1 - lat2;
        b = rad(long1 - long2);

        sa2 = Math.sin(a / 2.0);
        sb2 = Math.sin(b / 2.0);
        d = 2 * EARTH_RADIUS
                * Math.asin(Math.sqrt(sa2 * sa2 + Math.cos(lat1)
                * Math.cos(lat2) * sb2 * sb2));
        return d * 1000;
    }

    /**
     * 计算两个坐标距离（单位：m）
     *
     * @param long1 第一个坐标经度
     * @param lat1  第一个坐标纬度
     * @param long2 第二个坐标经度
     * @param lat2  第二个坐标纬度
     * @return
     * @author liujunxia
     * @date 2018年1月9日下午2:55:28
     * @version v0.0.1
     */
    public static Double getDistanceM(double long1, double lat1, double long2, double lat2) {
        double a, b, d, sa2, sb2;
        lat1 = rad(lat1);
        lat2 = rad(lat2);
        a = lat1 - lat2;
        b = rad(long1 - long2);

        sa2 = Math.sin(a / 2.0);
        sb2 = Math.sin(b / 2.0);
        d = 2 * EARTH_RADIUS
                * Math.asin(Math.sqrt(sa2 * sa2 + Math.cos(lat1)
                * Math.cos(lat2) * sb2 * sb2));
        DecimalFormat df = new DecimalFormat("#.0");
        return Double.valueOf(df.format(d * 1000));
    }

    /**
     * 获取实际经纬度和原来经纬度的差值
     *
     * @param latitude      原来纬度
     * @param longitude     原来经度
     * @param realLatitude  实际纬度
     * @param realLongitude 实际经度
     * @return
     */
    public static Double getDistance(BigDecimal latitude, BigDecimal longitude, BigDecimal realLatitude, BigDecimal realLongitude) {
        return getDistanceM(longitude.doubleValue(), latitude.doubleValue(), realLongitude.doubleValue(), realLatitude.doubleValue());
    }

    /**
     * 判断经纬度是否存在一个空
     *
     * @param latitude  纬度
     * @param longitude 经度
     * @return true 存在一个值为空  false 不存在值为空
     */
    public static boolean exsitEmpty(BigDecimal latitude, BigDecimal longitude) {
        return null == latitude || null == longitude;
    }

}
